package com.sheng.leetcode.year2025.month09.day02;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author by ls
 * @date 2025/9/17
 * <p>
 * 3025. 人员站位的方案数 I<p>
 * <p>
 * 给你一个  n x 2 的二维数组 points ，它表示二维平面上的一些点坐标，其中 points[i] = [xi, yi] 。<p>
 * 计算点对 (A, B) 的数量，其中<p>
 * A 在 B 的左上角，并且<p>
 * 它们形成的长方形中（或直线上）没有其它点（包括边界）。<p>
 * 返回数量。<p>
 * <p>
 * 示例 1：<p>
 * 输入：points = [[1,1],[2,2],[3,3]]<p>
 * 输出：0<p>
 * 解释：<p>
 * 没有办法选择 A 和 B，使得 A 在 B 的左上角。<p>
 * <p>
 * 示例 2：<p>
 * 输入：points = [[6,2],[4,4],[2,6]]<p>
 * 输出：2<p>
 * 解释：<p>
 * 左边的是点对 (points[1], points[0])，其中 points[1] 在 points[0] 的左上角，并且形成的长方形内部是空的。<p>
 * 中间的是点对 (points[2], points[1])，和左边的一样是合法的点对。<p>
 * 右边的是点对 (points[2], points[0])，其中 points[2] 在 points[0] 的左上角，但 points[1] 在长方形内部，所以不是一个合法的点对。<p>
 * <p>
 * 示例 3：<p>
 * 输入：points = [[3,1],[1,3],[1,1]]<p>
 * 输出：2<p>
 * 解释：<p>
 * 左边的是点对 (points[2], points[0])，其中 points[2] 在 points[0] 的左上角并且在它们形成的直线上没有其它点。注意两个点形成一条线的情况是合法的。<p>
 * 中间的是点对 (points[1], points[2])，和左边一样也是合法的点对。<p>
 * 右边的是点对 (points[1], points[0])，它不是合法的点对，因为 points[2] 在长方形的边上。<p>
 * <p>
 * 提示：<p>
 * 2 <= n <= 50<p>
 * points[i].length == 2<p>
 * 0 <= points[i][0], points[i][1] <= 50<p>
 * points[i] 点对两两不同。<p>
 */
public class LeetCode3025 {

    @Test
    public void test() {
//        int[][] points = {{1, 1}, {2, 2}, {3, 3}};
//        int[][] points = {{6, 2}, {4, 4}, {2, 6}};
//        int[][] points = {{3, 1}, {1, 3}, {1, 1}};
        int[][] points = {{0, 1}, {0, 2}, {2, 5}, {3, 0}};
        System.out.println(new Solution().numberOfPairs(points));
    }
}

class Solution {
    public int numberOfPairs(int[][] points) {
        /**
         * 存在 (A, B) 意味着数组 points 内首先得存在 [xi, yi] 和 [xj, yj] 满足 xi < xj && yi >= yj
         * 在这个条件下，要求没有其他点，意味着数组内的其他元素 [x, y] 需要 x < xi < xj < x || y < yj <= yi < y 的其中任意一个条件
         * 即，横向或者竖向任意一个方向上，满足，小于最小值，大于最大值，即可
         * 或者说循环数组，查询到有 xi <= x <= xj && yj <= y <= yi 时， (A, B) 不满足要求
         * 注意两个点形成一条线的情况是合法的
         */
        // x 按照从大道小排序，相等的情况下 y 按照从小到大排序
        Arrays.sort(points, (a, b) -> {
            if (a[0] == b[0]) return a[1] - b[1];
            return b[0] - a[0];
        });
        int n = points.length;
        int ans = 0;
        for (int i = 0; i < n; i++) {
            next:
            for (int j = n - 1; j > i; j--) {
                // 判断两个点是否满足 (A, B) 的条件要求。points[i] 点对两两不同
                if (points[i][1] <= points[j][1]) {
                    // 满足要求点位要求，判断是否存在其他点位
                    for (int k = i + 1; k < j; k++) {
                        if (points[k][1] <= points[j][1] && points[k][1] >= points[i][1]) {
                            continue next;
                        }
                    }
                    ans++;
                }
            }
        }
        return ans;
    }
}
// [3, 1]
// [3, 2]
// [3, 3]
// [2, 1]
// [2, 2]
// [2, 3]
// [1, 1]
// [1, 2]
// [1, 3]
